* Private Macros *
* **************** */
-#define GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE(object) (GTK_FILE_CHOOSER_BUTTON ((object))->priv)
+#define GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_FILE_CHOOSER_BUTTON, GtkFileChooserButtonPrivate))
#define DEFAULT_TITLE N_("Select A File")
#define HOME_DISPLAY_NAME N_("Home")
PROP_0,
PROP_DIALOG,
+ PROP_FOCUS_ON_CLICK,
PROP_TITLE,
PROP_WIDTH_CHARS
};
/* Used to track whether we need to set a default current folder on ::map() */
guint8 folder_has_been_set : 1;
+
+ guint8 focus_on_click : 1;
};
(GTK_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY)));
+ /**
+ * GtkFileChooserButton:focus-on-click:
+ *
+ * Whether the #GtkFileChooserButton button grabs focus when it is clicked
+ * with the mouse.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_FOCUS_ON_CLICK,
+ g_param_spec_boolean ("focus-on-click",
+ P_("Focus on click"),
+ P_("Whether the button grabs focus when it is clicked with the mouse"),
+ TRUE,
+ GTK_PARAM_READWRITE));
+
/**
* GtkFileChooserButton:title:
*
GtkWidget *box, *image, *sep;
GtkTargetList *target_list;
- priv = G_TYPE_INSTANCE_GET_PRIVATE (button, GTK_TYPE_FILE_CHOOSER_BUTTON,
- GtkFileChooserButtonPrivate);
- button->priv = priv;
+ priv = button->priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
priv->icon_size = FALLBACK_ICON_SIZE;
+ priv->focus_on_click = TRUE;
gtk_widget_push_composite_child ();
if (retval)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GtkTreeIter iter;
gint pos;
GdkPixbuf *pixbuf;
gchar *display_name;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (chooser);
-
- pos = model_get_type_position (GTK_FILE_CHOOSER_BUTTON (chooser),
- ROW_TYPE_SHORTCUT);
+ pos = model_get_type_position (button, ROW_TYPE_SHORTCUT);
pos += priv->n_shortcuts;
pixbuf = gtk_file_system_render_icon (priv->fs, path,
if (retval)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GtkTreeIter iter;
gint pos;
gchar type;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (chooser);
-
- pos = model_get_type_position (GTK_FILE_CHOOSER_BUTTON (chooser),
- ROW_TYPE_SHORTCUT);
+ pos = model_get_type_position (button, ROW_TYPE_SHORTCUT);
g_assert (gtk_tree_model_iter_nth_child (priv->model, &iter, NULL, pos));
do
GObjectConstructParam *params)
{
GObject *object;
+ GtkFileChooserButton *button;
GtkFileChooserButtonPrivate *priv;
GSList *list;
char *current_folder;
object = (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor) (type,
n_params,
params);
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object);
+ button = GTK_FILE_CHOOSER_BUTTON (object);
+ priv = button->priv;
if (!priv->dialog)
{
priv->fs =
g_object_ref (_gtk_file_chooser_get_file_system (GTK_FILE_CHOOSER (priv->dialog)));
- model_add_special (GTK_FILE_CHOOSER_BUTTON (object));
+ model_add_special (button);
list = gtk_file_system_list_volumes (priv->fs);
- model_add_volumes (GTK_FILE_CHOOSER_BUTTON (object), list);
+ model_add_volumes (button, list);
g_slist_free (list);
list = gtk_file_system_list_bookmarks (priv->fs);
- model_add_bookmarks (GTK_FILE_CHOOSER_BUTTON (object), list);
+ model_add_bookmarks (button, list);
gtk_file_paths_free (list);
- model_add_other (GTK_FILE_CHOOSER_BUTTON (object));
+ model_add_other (button);
priv->filter_model = gtk_tree_model_filter_new (priv->model, NULL);
gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter_model),
const GValue *value,
GParamSpec *pspec)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object);
+ GtkFileChooserButtonPrivate *priv = button->priv;
switch (param_id)
{
/* Construct-only */
priv->dialog = g_value_get_object (value);
break;
+ case PROP_FOCUS_ON_CLICK:
+ gtk_file_chooser_button_set_focus_on_click (button, g_value_get_boolean (value));
+ break;
case PROP_WIDTH_CHARS:
gtk_file_chooser_button_set_width_chars (GTK_FILE_CHOOSER_BUTTON (object),
g_value_get_int (value));
GValue *value,
GParamSpec *pspec)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object);
+ GtkFileChooserButtonPrivate *priv = button->priv;
switch (param_id)
{
g_value_set_int (value,
gtk_label_get_width_chars (GTK_LABEL (priv->label)));
break;
+ case PROP_FOCUS_ON_CLICK:
+ g_value_set_boolean (value,
+ gtk_file_chooser_button_get_focus_on_click (button));
+ break;
case PROP_TITLE:
case GTK_FILE_CHOOSER_PROP_ACTION:
static void
gtk_file_chooser_button_finalize (GObject *object)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GtkTreeIter iter;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object);
-
if (priv->old_path)
gtk_file_path_free (priv->old_path);
do
{
- model_free_row_data (GTK_FILE_CHOOSER_BUTTON (object), &iter);
+ model_free_row_data (button, &iter);
}
while (gtk_tree_model_iter_next (priv->model, &iter));
static void
gtk_file_chooser_button_destroy (GtkObject *object)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object);
+ GtkFileChooserButtonPrivate *priv = button->priv;
if (priv->dialog != NULL)
gtk_widget_destroy (priv->dialog);
guint info,
guint drag_time)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GtkFilePath *path;
gchar *text;
if (widget == NULL || context == NULL || data == NULL || data->length < 0)
return;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
-
switch (info)
{
case TEXT_URI_LIST:
break;
case TEXT_PLAIN:
- text = gtk_selection_data_get_text (data);
+ text = (char*) gtk_selection_data_get_text (data);
path = gtk_file_path_new_steal (text);
_gtk_file_chooser_select_path (GTK_FILE_CHOOSER (priv->dialog), path,
NULL);
static void
gtk_file_chooser_button_show (GtkWidget *widget)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+ GtkFileChooserButtonPrivate *priv = button->priv;
if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->show)
(*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->show) (widget);
static void
gtk_file_chooser_button_hide (GtkWidget *widget)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+ GtkFileChooserButtonPrivate *priv = button->priv;
gtk_widget_hide (priv->dialog);
static void
gtk_file_chooser_button_map (GtkWidget *widget)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+ GtkFileChooserButtonPrivate *priv = button->priv;
if (!priv->folder_has_been_set)
{
gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget,
gboolean group_cycling)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget);
+ GtkFileChooserButtonPrivate *priv = button->priv;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget);
switch (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (priv->dialog)))
{
case GTK_FILE_CHOOSER_ACTION_OPEN:
static void
change_icon_theme (GtkFileChooserButton *button)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButtonPrivate *priv = button->priv;
GtkSettings *settings;
GtkIconTheme *theme;
GtkTreeIter iter;
gint width, height;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
-
settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (button)));
if (gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU,
GtkTreeIter *iter,
gpointer user_data)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
gchar type;
gpointer data;
gboolean local_only, retval;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
type = ROW_TYPE_INVALID;
data = NULL;
local_only = gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (priv->dialog));
static void
update_combo_box (GtkFileChooserButton *button)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButtonPrivate *priv = button->priv;
GSList *paths;
GtkTreeIter iter;
gboolean row_found;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
-
g_assert (gtk_tree_model_get_iter_first (priv->filter_model, &iter));
paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (priv->dialog));
static void
update_label_and_image (GtkFileChooserButton *button)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButtonPrivate *priv = button->priv;
GdkPixbuf *pixbuf;
gchar *label_text;
GSList *paths;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (button->priv->dialog));
label_text = NULL;
pixbuf = NULL;
fs_volumes_changed_cb (GtkFileSystem *fs,
gpointer user_data)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GSList *volumes;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
-
model_remove_rows (user_data,
model_get_type_position (user_data, ROW_TYPE_VOLUME),
priv->n_volumes);
fs_bookmarks_changed_cb (GtkFileSystem *fs,
gpointer user_data)
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
GSList *bookmarks;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
-
bookmarks = gtk_file_system_list_bookmarks (fs);
if (!bookmarks)
{
static void
open_dialog (GtkFileChooserButton *button)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
+ GtkFileChooserButtonPrivate *priv = button->priv;
/* Setup the dialog parent to be chooser button's toplevel, and be modal
as needed. */
if (gtk_combo_box_get_active_iter (combo_box, &iter))
{
- GtkFileChooserButtonPrivate *priv;
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
gchar type;
gpointer data;
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
-
type = ROW_TYPE_INVALID;
data = NULL;
dialog_current_folder_changed_cb (GtkFileChooser *dialog,
gpointer user_data)
{
- GtkFileChooserButton *button;
- GtkFileChooserButtonPrivate *priv;
-
- button = GTK_FILE_CHOOSER_BUTTON (user_data);
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
priv->folder_has_been_set = TRUE;
if (g_ascii_strcasecmp (pspec->name, "local-only") == 0)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
if (priv->has_current_folder)
{
gint response,
gpointer user_data)
{
- GtkFileChooserButtonPrivate *priv;
-
- priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data);
+ GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data);
+ GtkFileChooserButtonPrivate *priv = button->priv;
if (response == GTK_RESPONSE_ACCEPT)
{
g_object_notify (G_OBJECT (button), "width-chars");
}
+/**
+ * gtk_file_chooser_button_set_focus_on_click:
+ * @button: a #GtkFileChooserButton
+ * @focus_on_click: whether the button grabs focus when clicked with the mouse
+ *
+ * Sets whether the button will grab focus when it is clicked with the mouse.
+ * Making mouse clicks not grab focus is useful in places like toolbars where
+ * you don't want the keyboard focus removed from the main area of the
+ * application.
+ *
+ * Since: 2.10
+ **/
+void
+gtk_file_chooser_button_set_focus_on_click (GtkFileChooserButton *button,
+ gboolean focus_on_click)
+{
+ GtkFileChooserButtonPrivate *priv;
+
+ g_return_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button));
+
+ priv = button->priv;
+
+ focus_on_click = focus_on_click != FALSE;
+
+ if (priv->focus_on_click != focus_on_click)
+ {
+ priv->focus_on_click = focus_on_click;
+ gtk_button_set_focus_on_click (GTK_BUTTON (priv->button), focus_on_click);
+ gtk_combo_box_set_focus_on_click (GTK_COMBO_BOX (priv->combo_box), focus_on_click);
+
+ g_object_notify (G_OBJECT (button), "focus-on-click");
+ }
+}
+
+/**
+ * gtk_file_chooser_button_get_focus_on_click:
+ * @button: a #GtkFileChooserButton
+ *
+ * Returns whether the button grabs focus when it is clicked with the mouse.
+ * See gtk_file_chooser_button_set_focus_on_click().
+ *
+ * Return value: %TRUE if the button grabs focus when it is clicked with
+ * the mouse.
+ *
+ * Since: 2.10
+ **/
+gboolean
+gtk_file_chooser_button_get_focus_on_click (GtkFileChooserButton *button)
+{
+ g_return_val_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button), FALSE);
+
+ return button->priv->focus_on_click;
+}
+
#define __GTK_FILE_CHOOSER_BUTTON_C__
#include "gtkaliasdef.c"